package com.hello.system.utils;

import java.util.HashMap;
import java.util.Map;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;

import lombok.extern.slf4j.Slf4j;

/**
 * 微信API工具类
 * 
 * @author hello
 */
@Slf4j
@Component
public class WxApiUtils {
    
    @Value("${wx.miniapp.appid:}")
    private String appid;
    
    @Value("${wx.miniapp.secret:}")
    private String secret;
    
    private static final String CODE2SESSION_URL = "https://api.weixin.qq.com/sns/jscode2session?appid={appid}&secret={secret}&js_code={code}&grant_type=authorization_code";
    
    private final RestTemplate restTemplate = new RestTemplate();
    
    /**
     * 根据code获取微信openid和session_key
     * 
     * @param code 登录凭证
     * @return 微信返回的会话信息
     */
    public JSONObject code2Session(String code) {
        if (code == null || code.isEmpty()) {
            log.error("微信登录code为空");
            return null;
        }
        
        // 检查appid和secret是否配置
        if (appid == null || appid.isEmpty() || secret == null || secret.isEmpty()) {
            log.error("微信小程序appid或secret未配置，请检查配置文件");
            JSONObject errorResult = new JSONObject();
            errorResult.put("errcode", -1);
            errorResult.put("errmsg", "系统配置错误：微信appid或secret未配置");
            return errorResult;
        }
        
        Map<String, String> params = new HashMap<>();
        params.put("appid", appid);
        params.put("secret", secret);
        params.put("code", code);
        
        try {
            log.info("请求微信接口获取openid，code={}", code);
            
            ResponseEntity<String> responseEntity = restTemplate.getForEntity(
                    CODE2SESSION_URL, String.class, params);
            
            String body = responseEntity.getBody();
            log.info("微信接口响应数据：{}", body);
            
            if (body != null && !body.isEmpty()) {
                JSONObject result = JSON.parseObject(body);
                
                // 检查是否包含openid
                if (result.getString("openid") != null) {
                    String openid = result.getString("openid");
                    // 安全记录日志，打印完整openid用于调试
                    log.info("成功获取微信openid完整值: {}", openid);
                    return result;
                }
                
                // 如果没有openid但有错误码
                if (result.getInteger("errcode") != null) {
                    Integer errcode = result.getInteger("errcode");
                    String errmsg = result.getString("errmsg");
                    
                    log.error("调用微信接口失败，错误码：{}，错误信息：{}", errcode, errmsg);
                    
                    // 对于常见错误给出更友好的提示
                    if (errcode == 40163) {
                        log.error("微信临时登录凭证code已被使用过，每个code只能使用一次，请重新获取");
                    } else if (errcode == 40029) {
                        log.error("微信临时登录凭证code无效");
                    } else if (errcode == 45011) {
                        log.error("微信接口调用频率受限");
                    } else if (errcode == 40226) {
                        log.error("微信账号被风控");
                    } else if (errcode == -1) {
                        log.error("微信系统繁忙，稍后再试");
                    }
                    
                    return result;
                }
            }
            
            log.error("微信接口返回数据异常：{}", body);
            JSONObject errorResult = new JSONObject();
            errorResult.put("errcode", -2);
            errorResult.put("errmsg", "微信接口返回数据异常");
            return errorResult;
        } catch (Exception e) {
            log.error("调用微信接口异常: {}", e.getMessage(), e);
            JSONObject errorResult = new JSONObject();
            errorResult.put("errcode", -3);
            errorResult.put("errmsg", "调用微信接口异常: " + e.getMessage());
            return errorResult;
        }
    }
    
    /**
     * 获取openid
     * 
     * @param code 微信临时登录凭证
     * @return openid
     */
    public String getOpenid(String code) {
        JSONObject result = code2Session(code);
        if (result != null) {
            return result.getString("openid");
        }
        return null;
    }
}